//
//  YFHomeViewController.swift
//  仿新浪微博
//
//  Created by 杨帆 on 16/6/29.
//  Copyright © 2016年 杨帆. All rights reserved.
//

import UIKit

// 原创微博可重用 cell id
private let originalCellId = "cellId"
// 被转发微博的可重用 cell id
private let retweetedCellId = "retweetedCellId"

class YFHomeViewController: YFBaseViewController {

    // 列表视图模型
    private lazy var listViewModel = YFStatusListViewModel()
    
    // 加载数据
    override func loadData() {
        
        print("准备刷新")
        // Xcode 8.0 的刷新控件，beginRefreshing 方法，什么都不显示！
        refreshControl?.beginRefreshing()
        
        // 模拟演示加载数据
        
        DispatchQueue.main.after(when: DispatchTime.now() + 2) {
        
            self.listViewModel.loadStatus(pullup: self.isPullup) { (isSuccess, shouldRefresh) in
                
                print("加载数据结束")
                
                // 结束刷新空间
                self.refreshControl?.endRefreshing()
                
                // 恢复上拉刷新标记
                self.isPullup = false
                
                // 刷新表格
                if shouldRefresh {
                
                    self.tableView?.reloadData()
                }
            }
        }
    }
    
    // 显示好友
    @objc private func showFriends() {

        let vc = YFDemoViewController()
        
//        vc.hidesBottomBarWhenPushed = true
        
        navigationController?.pushViewController(vc, animated: true)
    }

}

// MARK: - 表格数据源方法
extension YFHomeViewController {

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return listViewModel.statusList.count
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        // 0. 取出视图模型 根据视图模型判断可重用cell
        let vm = listViewModel.statusList[indexPath.row]
        let cellId = (vm.status.retweeted_status != nil) ? retweetedCellId : originalCellId
        
        // 1. 取cell 如果没有，找到 cell，按照自动布局的规则，从上向下计算，找到向下的约束，从而计算动态行高

        let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! YFStatusCell

        
        // 2. 设置cell
        cell.viewModel = vm
        
        // ---设置代理---
        // 如果用 block 需要在数据源方法中，给每一个 cell 设置 block
        // cell.completionBlock = { // ... }
        // 设置代理只是传递了一个指针地址
        cell.delegate = self

        
        // 3. 返回cell
        return cell
    }
    
    // 父类必须实现代理方法 子类才能够重写 
    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        
        // 1. 根据 indexpath 获取视图模型
        let vm = listViewModel.statusList[indexPath.row]
        
        // 2. 返回计算好的行高
        return vm.rowHeight
    }
}

// MARK: - WBStatusCellDelegate
extension YFHomeViewController:YFStatusCellDelegate {

    func statusCellDidSelectedURLString(cell: YFStatusCell, urlString: String) {
        
        let vc = YFWebViewController()
        
        vc.urlString = urlString
        
        navigationController?.pushViewController(vc, animated: true)
    }
}


// MARK: - 设置界面
extension YFHomeViewController {

    // 重写父类方法
    override func setupTableView() {
        
            super.setupTableView()
        
        
        // 设置导航栏按钮
        navItem.leftBarButtonItem = UIBarButtonItem(title: "好友", target: self, action: #selector(showFriends))
        
        // 注册原型cell
        tableView?.register(UINib(nibName: "YFStatusNormalCell", bundle: nil), forCellReuseIdentifier: originalCellId)
        tableView?.register(UINib(nibName: "YFStatusRetweetedCell", bundle: nil), forCellReuseIdentifier: retweetedCellId)
        
        // 取消设置行高
//        tableView?.rowHeight = UITableViewAutomaticDimension
        tableView?.estimatedRowHeight = 300
        
        // 取消分割线
        tableView?.separatorStyle = .none
        
        setupNavTitle()
    }
    
    // 设置导航标题栏
    private func setupNavTitle() {
    
        let title = YFNetWorkManager.shared.userAccount.screen_name
        
        let button = YFTitleButton(title: title)
        
        
        navItem.titleView = button
        
        button.addTarget(self, action: #selector(clickTitleButton), for: .touchUpInside)
        
    }
    
    @objc func clickTitleButton(btn: UIButton) {
     
        // 设置选中状态
        btn.isSelected = !btn.isSelected
        
    }

}
